package study.itwill.common;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.BufferedHttpEntity;

public class NHttpHandler extends HttpHandler {
	private static NHttpHandler current;

	public static NHttpHandler getInstance() {
		if (current == null) {
			current = new NHttpHandler();
		}

		return current;
	}

	public static void freeInstance() {
		if (current != null) {
			current = null;
		}
	}
	
	@Override
	/** 웹 서버에 요청을 보내고 응답을 리턴하는 메서드 - 1차 작업 */
	public InputStream connect(String url, String encType) {
		
		logger.debug("=========== method start >> connect");		
		
		// 접속 주소의 앞뒤 공백 제거
		url = url.trim();
		
		// 응답결과가 저장될 객체 --> 리턴대상
		InputStream istream = null;

		// 통신정보 설정
		HttpClient client = super.getClient(encType);

		// 접속을 수행하기 위한 객체
		HttpGet httpget = new HttpGet(url);
		
		httpget.addHeader("Referer", "http://www.naver.com");

		try {
			// 요청을 보내고, 응답을 받는다.
			HttpResponse response = client.execute(httpget);

			// 서버의 정상 동작 여부 검사
			int resultCode = response.getStatusLine().getStatusCode();

			if (resultCode == HttpURLConnection.HTTP_OK) {
				// 수신된 응답에서 실 데이터를 추출한다.
				HttpEntity entity = response.getEntity();
				BufferedHttpEntity buffer = new BufferedHttpEntity(entity);

				// 추출한 데이터를 InputStream으로 변환
				istream = buffer.getContent();
			} else {
				// 서버 에러의 원인
				String reason = response.getStatusLine().getReasonPhrase();
				
				logger.error("서버에러: " + resultCode);
				logger.error(reason);
				
			}
		} catch (ClientProtocolException e) {
			
			logger.error("통신처리 에러: " + e.getLocalizedMessage());

			logger.error(e.getLocalizedMessage());
			logger.error(e.getStackTrace());
			
		} catch (IOException e) {
			
			logger.error("응답수신 에러: " + e.getLocalizedMessage());

			logger.error(e.getLocalizedMessage());
			logger.error(e.getStackTrace());
			
		} catch (Exception e) {
			
			logger.error("기타 통신 에러: " + e.getLocalizedMessage());

			logger.error(e.getLocalizedMessage());
			logger.error(e.getStackTrace());
			
		} finally {
			// 통신 해제
			client.getConnectionManager().shutdown();
		}
		/********* 통신처리 끝 ********/
		
		logger.debug("=========== method end >> connect");

		return istream;
	}
}
